package ar.uade.edu.fain.ad.server.dao.jpa;

import java.util.HashSet;
import java.util.List;

import javax.persistence.PersistenceException;

import org.hibernate.Session;

import ar.uade.edu.fain.ad.server.business.Mesa;
import ar.uade.edu.fain.ad.server.business.MesaCompuesta;
import ar.uade.edu.fain.ad.server.business.MesaSimple;
import ar.uade.edu.fain.ad.server.business.Sector;
import ar.uade.edu.fain.ad.server.dao.MesaDAO;
import ar.uade.edu.fain.ad.server.dao.entity.MesaCompuestaEntity;
import ar.uade.edu.fain.ad.server.dao.entity.MesaEntity;
import ar.uade.edu.fain.ad.server.dao.entity.MesaSimpleEntity;
import ar.uade.edu.fain.ad.server.dao.entity.SectorEntity;

public class MesaJpaDAO 
		extends GenericJpaDAO<Mesa, MesaEntity, Long> 
		implements MesaDAO {

	public MesaJpaDAO() {
		super(MesaEntity.class);
	}

	@Override
	protected MesaEntity toEntity(Mesa business) {
		final Session session = getSession();
		MesaEntity entity = null;
		if (business.getId() == null) {
			if (business instanceof MesaCompuesta) {
				entity = new MesaCompuestaEntity();
			} else {
				final MesaSimpleEntity mesaSimpleEntity =
						new MesaSimpleEntity();
				mesaSimpleEntity.setCantidad(business.getCantidad());
				entity = mesaSimpleEntity;
			}
		} else {
			entity = (MesaEntity) session.get(getType(), business.getId());
		}
		if (entity instanceof MesaCompuestaEntity) {
			final MesaCompuestaEntity mesaCompuestaEntity = 
					(MesaCompuestaEntity) entity; 
			final HashSet<MesaEntity> entities = new HashSet<MesaEntity>();
			for (Mesa mesa : ((MesaCompuesta) business).getMesas()) {
				entities.add(toEntity(mesa));
			}
			mesaCompuestaEntity.setMesas(entities);
		}
		entity.setId(business.getId());
		entity.setEstado(business.getEstado());
		entity.setSector((SectorEntity) session.get(
				SectorEntity.class, business.getSector().getId()));
		return entity;
	}

	@Override
	protected Mesa toBusiness(MesaEntity entity) {
		Mesa mesa = null;
		if (entity instanceof MesaSimpleEntity) {
			final MesaSimple mesaSimple = new MesaSimple();
			mesaSimple.setCantidad(((MesaSimpleEntity) entity).getCantidad());
			mesa = mesaSimple;
		} else {
			final MesaCompuesta mesaCompuesta = new MesaCompuesta();
			final MesaCompuestaEntity mesaCompuestaEntity = 
					(MesaCompuestaEntity) entity;
			for (MesaEntity mesaEntity : mesaCompuestaEntity.getMesas()) {
				mesaCompuesta.getMesas().add(toBusiness(mesaEntity));
			}
			mesa = mesaCompuesta;
		}
		mesa.setId(entity.getId());
		final Sector sector = new Sector();
		sector.setId(entity.getSector().getId());
		mesa.setSector(sector);
		mesa.setEstado(entity.getEstado());
		return mesa;
	}
	
	@Override
	public List<Mesa> buscarMesas(
			final Long salonId, final String estado) {
		return execute(new Query<List<Mesa>>() {
			@Override
			public List<Mesa> inTransaction(final Session session)
					throws PersistenceException {
				@SuppressWarnings("unchecked")
				final List<MesaEntity> results = 
						session.getNamedQuery("mesa.porEstado")
								.setString("estado", estado)
								.setLong("salonId", salonId)
								.list();
				return toBusiness(results);
			}
		});
	}
	
}
